#-- coding: utf-8 -*-
#import tgame_stage_config, tgame_achieve_config
import tgame_stage_config
#房间内玩家对象类
class CPlayer(object):
	def __init__(self, objRoom, uid):
		super(CPlayer, self).__init__()
		self.objRoom = objRoom		#房间对象的引用
		self.iSide = -1				#玩家的唯一标识
		self.hid = -1					#玩家的socket（其实客户端不知道）
		self.uid = uid				#玩家的uid
		self.urs = ""					#玩家的账号
		self.ip = ""					#玩家的ip
		self.nickname = ""		#玩家的昵称
		self.gmlvl = -1				#玩家的gm等级
		self.avatar = None		#玩家的人物avatar信息
		self.pet = None				#玩家的宠物avatar信息

		self.score = 0				#玩家的总积分
		self.win_count = 0		#玩家的胜利局数
		self.draw_count = 0		#玩家的平局局数
		self.lose_count = 0		#玩家的失败局数
		self.break_count = 0	#玩家的断线/逃跑局数
		self.yuanbao = 0			#玩家充值人民币代币
		self.yuanbao_free = 0	#玩家的获赠人民币代币

		self.bIsReady = False	#玩家是否准备好进行游戏
		self.bIsInit = False	#玩家是否发送了本局带入游戏卡片列表
		self.iSelectStage = 1	#玩家自己选中的当前关卡
		self.lstFinishStage = []	#玩家已经完成的关卡列表
		self.lstSelectableStage = []	#玩家可选的关卡列表
		self.lstFinishAchieve = []		#玩家已经完成的成就列表

	#自清理函数
	def clean(self):
		#释放对房间对象的引用
		self.objRoom = None

	#客户端判断是否能够使用巫师指令的函数，目前永远返回True
	def can_use_wizard(self):
		return True

	#加载玩家基本信息的函数
	def load_base_data(self, side, urs, uid, nickname, is_ready, gmlvl,hid):
		self.iSide = side
		self.urs = urs
		self.uid = uid
		self.nickname = nickname
		self.bIsReady = is_ready
		self.gmlvl = gmlvl
		self.hid = hid

	#加载玩家具体信息的函数
	def load_detail_data(self, score, win_count, lose_count, draw_count, break_count):
		self.score = score
		self.win_count = win_count
		self.draw_count = draw_count
		self.lose_count = lose_count
		self.break_count = break_count

	#加载玩家avatar信息的函数
	def load_avatar_info(self, avatar, pet):
		print "avatar = %r; pet = %r" % (avatar, pet)
		self.avatar = avatar
		self.pet = pet

	#加载玩家隐私信息的函数（所谓隐私信息就是不会收到其他玩家的相关信息，只会收到自己的）
	def load_secret_info(self, yuanbao, yuanbao_free, finish_stage, finish_achieve):
		#玩家的人民币代币信息
		self.yuanbao = yuanbao
		self.yuanbao_free = yuanbao_free

		#保存玩家已经完成关卡的信息
		self.lstFinishStage = []
		for obj in finish_stage:
			self.lstFinishStage.append(obj.value)
		#根据玩家已经完成的关卡的信息，生成玩家可选关卡的列表
		self.lstSelectableStage = []
		for stage, require in tgame_stage_config.STAGE_REQUIRE.iteritems():
			flag = True
			for rstage in require:
				if not rstage in self.lstFinishStage:
					flag = False
					break
			if flag:
				self.lstSelectableStage.append(stage)
		self.lstSelectableStage.sort()

		#保存玩家已经完成的成就的信息
		self.lstFinishAchieve = []
		for obj in finish_achieve:
			self.lstFinishAchieve.append(obj.value)


	#返回当前游戏总成就点数的函数
	def get_achieve_point(self):
		total = 0
		for _id in self.lstFinishAchieve:
			config = tgame_achieve_config.data.get(_id)
			if config:
				total += config["AchieveScore"]
		return total

	#返回总局数的函数
	def get_total_round(self):
		return self.win_count + self.draw_count + self.lose_count + self.break_count

	#返回胜率的函数
	def get_win_percent(self):
		if self.get_total_round() == 0:
			return 0
		else:
			return 100 * self.win_count / self.get_total_round()


	#改变玩家准备状态标志位的函数
	def change_ready(self, is_ready):
		self.bIsReady = is_ready

	#进入游戏初始化状态时调用的函数
	def game_init(self):
		self.bIsReady = False

	#结束游戏，返回游戏准备状态时调用的函数
	def game_end(self, stage, rank, score):
		#如果玩家当前局的胜利且当前关卡不在已经完成的关卡列表里
		"""if rank == 1 and (not stage in self.lstFinishStage):
			#更新已经完成的关卡列表
			self.lstFinishStage.append(stage)
			#已经完成的关卡列表改变了，需要重新生成可选关卡列表
			self.lstSelectableStage = []
			for stage, require in tgame_stage_config.STAGE_REQUIRE.iteritems():
				flag = True
				for rstage in require:
					if not rstage in self.lstFinishStage:
						flag = False
						break
				if flag:
					self.lstSelectableStage.append(stage)
			self.lstSelectableStage.sort()
		"""
		#玩家胜利，胜利局数+1
		if rank:
			self.win_count += 1
		#否则就是负局数+1（游戏目前没有平局）
		else:
			self.lose_count += 1
		#本局得分累加到总积分上
		self.score = score

	#此函数在收到服务端的得到某个成就的消息的时候调用，更新已经完成的成就信息
	def finish_achieve(self, achieve_id):
		if not achieve_id in self.lstFinishAchieve:
			self.lstFinishAchieve.append(achieve_id)
